#include "defs.h"

/***********************************
 *  Kernel						   *
 ***********************************/

#ifndef _kernel_
#define _kernel_

#define OS_PID	0


DESCR_INT idt[256];			/* IDT de 256 entradas*/
DESCR_SEG gdt[256];
FD fdt[3];					/* tabla de File Descriptors */


int (*player)(void);
typedef int size_t;
typedef short int ssize_t;
typedef enum eINT_80 {WRITE=0, READ} tINT_80;
typedef enum eUSER {U_KERNEL=0, U_NORMAL} tUSERS;

/* __write
*
* Recibe como parametros:
* - File Descriptor
* - Buffer del source
* - Cantidad
*
**/
size_t __write(int fd, const void* buffer, size_t count);

/* __read
*
* Recibe como parametros:
* - File Descriptor
* - Buffer a donde escribir
* - Cantidad
*
**/
size_t __read(int fd, void* buffer, size_t count);


/*
 * Inicializa un descriptor de la IDT. Recibe puntero a elemento de la IDT, selector a cargar,
 * puntero a rutina de atencion, derechos de acceso al segmento y cero
 */
void setup_IDT_entry (DESCR_INT *item, byte selector, dword offset, byte access, byte cero);

/*
 * Carga los descriptores de la IDT necesarios y habilita en los pic las interrupciones que se van a usar
 */
void cargaIDT();

/*
 * Imprime los valores de la gdt
 */
void printGDT();

/*
 * Carga los descriptores de la GDT necesarios
 */
void cargaIDT();


/*
 * Devuelve un puntero al File Descriptor ubicado en el indice indicado por el parametro
 */
FD* open(int fd);

/*
 * System Call que imprime n bytes del buffer en el File Descriptor indicado mediante la INT80
 */
void write(int fd, char *buffer, int size);

/*
 * Funcion auxiliar para imprimir cada caracter de la funcion write
 */
void writeChar(int fd, char chr);

/*
 * System Call que lee n bytes del File Descriptor indicado mediante la INT80
 */
void read(int fd, char *buffer, int size);

/*
 * Funcion auxiliar para leer cada caracter de la funcion read
 */
void readChar(int fd, char *chr);

/*
 * Lee un byte de un puerto
 */
unsigned char inportb(int port);

/*
 * Escribe un byte en un puerto
 */
void outportb(int port,unsigned char value);


#endif
